﻿
namespace FastFood.Windows.Forms.Administracion.Comestibles
{
    using System.Collections.Generic;
    using System.Data.Linq;
    using System.Linq;
    using System.Windows.Forms;
    using FastFood.Business.Entities;
    using FastFood.Business.Logic;
    using FastFood.Windows.Helpers;
    using System.Drawing;
    using System;

    public partial class CwfLotes : UserControl
    {
        Insumos insumoSeleccionado;
        CwfAlmacenableBusqueda insumosBusqueda;
        public EstadoActual estadoActual;
        private Font font;
        
        public CwfLotes()
        {
            InitializeComponent();
            SetFont();
        }

        private void CwfPlatos_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                this.TsMenu.FormularioID = Convert.ToByte(this.Tag);
                this.TsMenu.LoadPermisos();
                ClearControls();
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);

                insumosBusqueda = new CwfAlmacenableBusqueda();
                insumosBusqueda.CwfAlmacenableBusqueda_SeleccionEntidad += new GetObjeto(insumosBusqueda_SeleccionEntidad);
                insumosBusqueda.BorderStyle = BorderStyle.None;
                cmbInsumo.DropDownControl = insumosBusqueda;
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsbNuevo_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            this.cwfAlmacenamiento1.ListaAlmacenes = new List<Almacenamientos>();
            this.cwfAlmacenamiento1.InitialLoad();
            splitContainer3.Focus();
            //this.nombreTextBox.Focus();
            this.loteBindingSource.AddNew();
        }

        private void TsbEditar_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.cmbInsumo.Focus();
        }

        private void TsbEliminar_Click(object sender, EventArgs e)
        {
            if (Convert.ToDouble(txtStock.Text) > 0)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "No se puede eliminar un lote con stock mayor a 0");
            } 
            else if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
                if (this.loteBindingSource.Current != null)
                {
                    LoadLote(this.loteBindingSource.Current as Lotes);
                }
            }
        }

        private void TsbGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    if (this.loteBindingSource.Current != null)
                    {
                        LoadLote(this.loteBindingSource.Current as Lotes);
                    }
                    EnabledControls(true);
                    EnabledButtons(true);
                    this.lotesDataGridView.Focus();
                }
            }
        }

        private void TsbCancelar_Click(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo)
            {
                ClearControls();
                this.cwfAlmacenamiento1.ListaAlmacenes = new List<Almacenamientos>();
                this.cwfAlmacenamiento1.InitialLoad();
                this.cwfAlmacenamiento1.ClearControls();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.loteBindingSource.CancelEdit();
            this.lotesDataGridView.Focus();
        }

        private void platoDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadLote(this.loteBindingSource.Current as Lotes);
            }
        }

        private void platoDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal) return;
            if (e.KeyCode == Keys.Delete)
            {
                if (this.lotesDataGridView.SelectedRows.Count != 0)
                {
                    if (Convert.ToDouble(txtStock.Text) > 0)
                    {
                        Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "No se puede eliminar un lote con stock mayor a 0");
                    }
                    else if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        this.estadoActual = EstadoActual.Eliminar;
                        SaveData();
                        this.estadoActual = EstadoActual.Normal;
                        if (this.loteBindingSource.Current != null)
                        {
                            LoadLote(this.loteBindingSource.Current as Lotes);
                        }
                    }
                }
            }
        }

        private void InitialLoad()
        {
            try
            {
                LotesManager loteManager = new LotesManager();
                var temp = loteManager.ListarActivos();
                this.loteBindingSource.DataSource = temp;
                this.loteBindingNavigator.BindingSource = this.loteBindingSource;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void LoadLote(Lotes lote)
        {
            lote = new LotesManager().Obtener(lote.loteID);
            this.insumoSeleccionado = lote.Insumos;
            validarOpcionesInsumo(insumoSeleccionado.tieneLote, insumoSeleccionado.tieneVencimiento);

            this.loteIDLabel.Text = lote.loteID.ToString();
            this.insumoIDLabel.Text = lote.insumoID.ToString();
            this.cmbInsumo.Text = lote.Insumos.nombre;
            this.txtNumero.Text = lote.Insumos.tieneLote ? lote.numero : "";
            this.dtpVencimiento.Value = lote.Insumos.tieneVencimiento ? lote.fechaVencimiento.Value : DateTime.Now;
            this.txtStock.Text = lote.stock.ToString();
            this.cwfAlmacenamiento1.ListaAlmacenes = lote.Almacenamientos.ToList() ?? new List<Almacenamientos>();
            this.cwfAlmacenamiento1.InitialLoad();   
        }

        private bool SaveData()
        {
            bool result = false;
            try
            {
                LotesManager loteManager = new LotesManager();

                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        loteManager.Agregar(GetLote());
                        break;
                    case EstadoActual.Editar:
                        loteManager.Modificar(GetLote());
                        break;
                    case EstadoActual.Eliminar:
                        loteManager.Eliminar(Convert.ToInt16(this.loteIDLabel.Text));
                        this.loteBindingSource.RemoveCurrent();
                        break;
                }

                this.loteBindingSource.EndEdit();
                result = true;
                InitialLoad();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        private Lotes GetLote()
        {
            Lotes lote = new Lotes()
            {
                loteID = Convert.ToInt32(this.loteIDLabel.Text),
                insumoID = Convert.ToInt16(this.insumoIDLabel.Text),
                numero = insumoSeleccionado.tieneLote ? txtNumero.Text : null,
                fechaVencimiento = insumoSeleccionado.tieneVencimiento ? dtpVencimiento.Value : default(DateTime?),
                stock = Convert.ToDouble(txtStock.Text)
            };
            lote.Almacenamientos = new EntitySet<Almacenamientos>();
            lote.Almacenamientos.AddRange(cwfAlmacenamiento1.ListaAlmacenes);
            return lote;
        }

        private bool ValidateData()
        {
            bool result = true;

            if (this.insumoIDLabel.Text == "-1")
            {
                this.errValidator.SetError(this.insumoIDLabel, "Seleccionar Insumo.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.insumoIDLabel, string.Empty);
            }

            if (txtNumero.Enabled && string.IsNullOrEmpty(txtNumero.Text))
            {
                this.errValidator.SetError(this.txtNumero, "Ingresar número de lote.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtNumero, string.Empty);
            }

            if (cwfAlmacenamiento1.ListaAlmacenes.Count == 0)
            {
                this.errValidator.SetError(this.DetalleLabel, "Ingresar los almacenes donde se ingresarán.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.DetalleLabel, string.Empty);
            }
            
            return result;
        }

        private void EnabledControls(bool valor)
        {
            this.gbxInformacion.Enabled = !valor;
            this.cwfAlmacenamiento1.Enabled = !valor;
            this.loteBindingNavigator.Enabled = valor;
            this.lotesDataGridView.Enabled = valor;
        }

        private void EnabledButtons(bool valor)
        {
            this.TsMenu.EnabledNuevo = valor;
            this.TsMenu.EnabledEditar = valor;
            this.TsMenu.EnabledEliminar = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsMenu.EnabledGuardar = true;
                this.TsMenu.EnabledCancelar = true;
                this.lotesDataGridView.Enabled = false;
            }
            else
            {
                this.TsMenu.EnabledGuardar = false;
                this.TsMenu.EnabledCancelar = false;
                this.lotesDataGridView.Enabled = true;
            }
        }

        private void ClearControls()
        {
            this.insumoSeleccionado = null;
            this.loteIDLabel.Text = "-1";
            this.insumoIDLabel.Text = "-1";
            this.cmbInsumo.Text = "[Seleccionar un insumo]"; 
            validarOpcionesInsumo(false, false);
            this.lblMensajeInsumo.Text = "No se a seleccionado un insumo";
            this.txtNumero.Text = string.Empty;
            this.dtpVencimiento.Value = DateTime.Now;
            this.txtStock.Text = "0";
            this.errValidator.Clear();
        }

        private void cmbInsumos_DropDown(object sender, EventArgs e)
        {
            insumosBusqueda.limpiar();
            cmbInsumo.Text = "[Seleccionar un insumo]";
        }

        private void cmbInsumos_DropDownClosed(object sender, EventArgs e)
        {

        }

        public void insumosBusqueda_SeleccionEntidad(object objeto)
        {
            Insumos insumo = (Insumos)objeto;
            insumoSeleccionado = insumo;
            validarOpcionesInsumo(insumo.tieneLote, insumo.tieneVencimiento);
            cmbInsumo.Text = insumo.nombre;
            insumoIDLabel.Text = insumo.insumoID.ToString();
            txtNumero.Focus();
            cmbInsumo.HideDropDown();
        }

        private void validarOpcionesInsumo(bool tieneLote, bool tieneVencimiento)
        {
            int estado = Convert.ToInt32(tieneLote) * 2 + Convert.ToInt32(tieneVencimiento);
            txtNumero.Enabled = tieneLote;
            dtpVencimiento.Enabled = tieneVencimiento;

            switch (estado)
            {
                case 3:
                    this.lblMensajeInsumo.Text = "Este insumo tiene vencimiento y número de lote";
                    break;
                case 2:
                    this.lblMensajeInsumo.Text = "Este insumo no tiene Vencimiento";
                    break;
                case 1:
                    this.lblMensajeInsumo.Text = "Este insumo no tiene número de lote";
                    break;
                case 0:
                    this.lblMensajeInsumo.Text = "Este insumo no tiene vencimiento ni número de lote";
                    break;
            }           
        }

        private void cmbInsumos_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down)
            {
                cmbInsumo.ShowDropDown();
            }
            else
                e.SuppressKeyPress = true;
        }

        private void SetFont()
        {
            this.font = SystemFonts.IconTitleFont;
            if (this.Font != font)
            {
                this.Font = this.font;
                this.font = new Font("Tahoma", 7);
                this.lotesDataGridView.RowTemplate.Height = (TextRenderer.MeasureText("I", this.font).Height + 5) * 3;
            }
        }

        private void platoDataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if ((e.ColumnIndex >= 0) && (e.RowIndex >= 0))
            {
                Graphics g = e.Graphics;
                bool selected = ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected);
                System.Drawing.Color fcolor = (selected ? e.CellStyle.SelectionForeColor : e.CellStyle.ForeColor);
                System.Drawing.Color bcolor = (selected ? e.CellStyle.SelectionBackColor : e.CellStyle.BackColor);
                Font font = e.CellStyle.Font;
                font = new Font("Tahoma", 7);

                Lotes lote = this.loteBindingSource[e.RowIndex] as Lotes;

                if (lote != null)
                {
                    int x = e.CellBounds.Left + e.CellStyle.Padding.Left;
                    int y = e.CellBounds.Top + e.CellStyle.Padding.Top;
                    int width = e.CellBounds.Width - (e.CellStyle.Padding.Left + e.CellStyle.Padding.Right);
                    int height = 13 + (e.CellStyle.Padding.Top + e.CellStyle.Padding.Bottom);

                    g.FillRectangle(new SolidBrush(bcolor), e.CellBounds);

                    y = y + height - 1;

                    if (e.ColumnIndex == 0)
                    {
                        font = new Font("Tahoma", 8, FontStyle.Bold);

                        if (selected)
                            TextRenderer.DrawText(e.Graphics, lote.Insumo_Nombre, font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                        else
                            TextRenderer.DrawText(e.Graphics, lote.Insumo_Nombre, font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);

                        font = new Font("Tahoma", 8);
                        y = y + height - 1;
                        TextRenderer.DrawText(e.Graphics, lote.NumeroFormateado.ToString().PadLeft(4, '0'), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    }
                    else
                    {
                        font = new Font("Tahoma", 9, FontStyle.Bold);
                        if (selected)
                            TextRenderer.DrawText(e.Graphics, lote.FechaVencimientoFormateado.ToString(), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                        else
                            TextRenderer.DrawText(e.Graphics, lote.FechaVencimientoFormateado.ToString(), font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);

                        font = new Font("Tahoma", 8);
                        y = y + height - 1;
                        TextRenderer.DrawText(e.Graphics, "ID: " + lote.loteID.ToString().PadLeft(4, '0'), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    }
                }

                e.Handled = true;
            }
            else if ((e.ColumnIndex == 0) && (e.RowIndex >= 0))
            {
                e.Paint(e.ClipBounds, e.PaintParts & ~DataGridViewPaintParts.Focus);
                e.Handled = true;
            }
        }

        private void platoDataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            if (e.RowIndex == this.loteBindingSource.Position)
            {
                e.DrawFocus(e.RowBounds, true);
            }
            else
            {
                using (Pen p = new Pen(Color.LightGray))
                {
                    e.Graphics.DrawRectangle(p, e.RowBounds);
                }
            }
        }
    }
}
